#ifndef _FILE_MANAGEMENT_
#define _FILE_MANAGEMENT_

#include "message.h"

#include <fstream>
#include <sstream>
#include <unistd.h>
#include <dirent.h>
#include <errno.h>

/* definições de status */
#define S_READY 0 /* pronto para manipular arquivo */
#define S_ERROR_N_EXIST 1 /* arquivo nao existe */
#define S_ERROR_DENY_R 2 /* sem permissao de leitura */
#define S_ERROR_DENY_W 3 /* sem permissao de escrita */
#define S_ERROR_DIR_N_EXIT 4 /* diretorio nao existe */
#define S_ERROR_UNKN 5 /* erro desconhecido */
#define S_ERROR_SYNTAX 6 /* falha na sintaxe de execução da classe */
#define S_EOF 6 /* ponteiro no fim do arquivo */
#define S_CLOSED 7 /* arquivo fechado */

/* modos para abertura de arquivo */
#define MODE_R 1
#define MODE_W 2
#define MODE_RW 3

#define APPEND 1
#define EDIT 2

class fileManagement
{
    public:
        fileManagement(const char *filename = NULL, byte mode = MODE_RW);
        ~fileManagement();
        const string getFileName();
        unsigned int currentPatch();
        byte currentStatus();
        void resetPatch();
        byte currentDataSize();
        const byte *currentData();
        const byte *nextData();
        void editLine(const byte *data, size_t size);
        bool setLine(unsigned int line);
        unsigned int nLines();
        bool saveEdit();
        bool closeEdit();
        bool append(const byte *data, size_t size);
        byte writeMode(byte mode = 0);
        void close();
        int isPaste(const char *);
    private:
        bool setData();
        void setFileSize();
        bool findLine();
        byte status;
        byte wMode;
        size_t dataSize;
        size_t fileSize;
        unsigned int line;
        string editString;
        unsigned int patchCont;
        byte messageData[MAX_DATA_SIZE+1]; /* proteger o fim dos dados com um \0 */
        string fileName;
        fstream *controlledFile;
};

#endif
